package com.cxd.performance.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Author: Calvin
 * Date: 2019-08-30 8:40
 * Description: 正则表达式 工具类
 */
public class RegexUtils {

    private RegexUtils() {

    }

    private static final String EMAIL_REG = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$";
    private static final String CARNUM_REG = "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼]{1}(([A-HJ-Z]{1}[A-HJ-NP-Z0-9]{5})|([A-HJ-Z]{1}(([DF]{1}[A-HJ-NP-Z0-9]{1}[0-9]{4})|([0-9]{5}[DF]{1})))|([A-HJ-Z]{1}[A-D0-9]{1}[0-9]{3}警)))|([0-9]{6}使)|((([沪粤川云桂鄂陕蒙藏黑辽渝]{1}A)|鲁B|闽D|蒙E|蒙H)[0-9]{4}领)|(WJ[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼·•]{1}[0-9]{4}[TDSHBXJ0-9]{1})|([VKHBSLJNGCE]{1}[A-DJ-PR-TVY]{1}[0-9]{5})";
    private static final String MOBIL_REG = "(\\+\\d+)?1[3456789]\\d{9}$";
    private static final String PHONE_REG = "(\\+\\d+)?(\\d{3,4}\\-?)?\\d{7,8}$";

    /**
     *  邮箱合法性校验
     *
     * @param email
     * @return
     */
    public static boolean validateEmailFormat(String email) {
        Pattern p = Pattern.compile(EMAIL_REG);
        Matcher m = p.matcher(email);
        return m.matches();
    }

    /**
     * 常规车牌号：省份+地区代码+五位数字/大写英文字母（序号位）如：粤B12345。
     * 1. 序号位不存在字母I和O防止1、0混淆
     * 2. 省份范围：京、津、沪、渝、冀、豫、云、辽、黑、湘、皖、鲁、新、苏、浙、赣、鄂、桂、甘、晋、蒙、陕、吉、闽、贵、粤、青、藏、川、宁、琼。
     * 3. 地区代码O为省级公安厅专用车牌
     * 4. 地区代码U为省级政府专用车牌
     * 5. 地区代码中暂无I
     *
     * 新能源车牌号：省份简称（1位汉字）+发牌机关代号（1位字母）+序号（6位）
     * 1. 小型新能源汽车号牌（序号）的第一位必须使用字母D、F（D代表纯电动新能源汽车，F代表非纯电动新能源汽车），第二位可以使用字母或者数字，后四位必须使用数字。
     * 2. 大型新能源汽车号牌（序号）的第六位必须使用字母D、F（D代表纯电动新能源汽车，F代表非纯电动新能源汽车），前五位必须使用数字。
     * 3. 序号中英文字母I和O不能使用。
     * 4. 省份范围同常规车牌号
     * 5. 发牌机关代码暂无I
     *
     * 警车车牌：车牌最后汉字为警字
     * 1. 省份+地区代码+4位数字+警（川A0001警）
     * 2. 省份+地区代码+字母+3位数字（川AA001警）字母可选项包括（A、B、C、D）
     * 3. 省份范围同常规车牌号
     * 4. 地区代码没有I
     * 5. 地区代码为O时代表为省级公安厅专用车牌
     *
     * 领事馆车牌：车牌中包括“使”或“领”字
     * 1. 大使馆：三位国家代码（数字）+三位车辆编号（数字）+使
     * 2. 领事馆：省份简称+地区代码+四位车辆编号（数字）+领（省份与地区代码可选范围包括：沪A、粤A、川A、云A、桂A、鄂A、闽D、鲁B、陕A、蒙A、蒙E、蒙H、藏A、黑A、辽A、渝A）
     *
     * 武警车牌：车牌开头包括WJ
     * 1. 武警总部车牌：WJ+•（中间点）+四个数字+数字或字母
     * 2. 武警地方车牌：WJ+省份简称+四位数字+数字或字母
     * 3. 省份范围同常规车牌号
     * 4. 其中字母包括（T D S H B X J）
     *
     * 军用车牌：字头+字头号 +序号组成。
     * 1. 字头：大写字母汉语拼音字母，字母包括（VKHBSLJNGCE）
     * 2. 字头号：大写英文字母，字母包括（A-D,J-P,R-T,V,Y）
     * 3. 序号：5位数字
     * @param content
     * @return
     */
    public static boolean checkPlateNumberFormat(String content) {
        return Pattern.matches(CARNUM_REG, content);
    }

    /**
     * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
     * @param mobile 移动、联通、电信运营商的号码段
     *<p>移动的号段：134(0-8)、135、136、137、138、139、147（预计用于TD上网卡）
     *、150、151、152、157（TD专用）、158、159、187（未启用）、188（TD专用）</p>
     *<p>联通的号段：130、131、132、155、156（世界风专用）、185（未启用）、186（3g）</p>
     *<p>电信的号段：133、153、180（未启用）、189</p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkMobile(String mobile) {
        return Pattern.matches(MOBIL_REG,mobile);
    }

    /**
     * 验证固定电话号码
     * @param phone 电话号码，格式：国家（地区）电话代码 + 区号（城市代码） + 电话号码，如：+8602085588447
     * <p><b>国家（地区） 代码 ：</b>标识电话号码的国家（地区）的标准国家（地区）代码。它包含从 0 到 9 的一位或多位数字，
     *  数字之后是空格分隔的国家（地区）代码。</p>
     * <p><b>区号（城市代码）：</b>这可能包含一个或多个从 0 到 9 的数字，地区或城市代码放在圆括号——
     * 对不使用地区或城市代码的国家（地区），则省略该组件。</p>
     * <p><b>电话号码：</b>这包含从 0 到 9 的一个或多个数字 </p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkPhone(String phone) {
        return Pattern.matches(PHONE_REG, phone);
    }
}
